struct file {
  enum { FD_NONE, FD_PIPE, FD_INODE } type;
  int ref;      // reference count引用次数
  char readable;
  char writable;      //是否可写
  struct pipe *pipe;
  struct inode *ip;   //应该是inode的i号
  uint off;                 // 这个是干什么的？？？
};


// in-memory copy of an inode   内存中的i块号  对应了fs.h中磁盘中
struct inode {
  uint dev;           // Device number
  uint inum;          // Inode number
  int ref;            // Reference count 用于统计有多少个 C 指针指向它 如果 `ref` 变为0，内核就会丢掉这个 i 节点
  struct sleeplock lock; // protects everything below here
  int valid;          // inode has been read from disk?   很重要的一个参数

  short type;         // copy of disk inode
  short major;
  short minor;
  short nlink;
  uint size;
  uint addrs[NDIRECT+1];
};

// table mapping major device number to
// device functions
// 将主要设备号映射到设备功能的表
struct devsw {
  int (*read)(struct inode*, char*, int);
  int (*write)(struct inode*, char*, int);    //read为什么要加*符号？？？
};

extern struct devsw devsw[];

#define CONSOLE 1
